package com.szl.agentdemo;

import javassist.*;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;


public class MyTransformer implements ClassFileTransformer {

    /**
     *
     * @param loader  ： 类加载器
     * @param className ： 当前加载的类名
     * @param classBeingRedefined
     * @param protectionDomain
     * @param classfileBuffer ：类原始的字节码文件
     * @return
     * @throws IllegalClassFormatException
     */
    @Override
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
        if(className.equals("com/szl/code/Util")){
            String s = className.replaceAll("/", ".");
            try {
                ClassPool classPool = ClassPool.getDefault();
                classPool.insertClassPath(new LoaderClassPath(loader));
                CtClass ctClass = classPool.get(s);
                if(ctClass.isFrozen()){
                    ctClass.defrost();
//                    ctClass = classPool.makeClass(new ByteArrayInputStream(classfileBuffer));
                }
                CtMethod sumOfAge = ctClass.getDeclaredMethod("sumOfAge");
                sumOfAge.insertBefore("{System.out.println(\"sumOfAge函数 开始\");}");
                sumOfAge.insertAfter("{System.out.println(\"sumOfAge函数 结束\");}");
//                // 返回字节码，并且detachCtClass对象
//                byte[] byteCode = ctClass.toBytecode();
//                //detach的意思是将内存中曾经被javassist加载过的Date对象移除，如果下次有需要在内存中找不到会重新走javassist加载
//                ctClass.detach();
                return ctClass.toBytecode();
            } catch (NotFoundException | CannotCompileException | IOException e) {
                e.printStackTrace();
            }

        }
        return null;
    }
}
